//
// Created by Zhangwj on 2023/9/26.
//

#include "ConstInitValNode.h"

std::unique_ptr<ConstInitValNode> ConstInitValNode::ConstInitValParser(Parser &parser) {
    //ConstInitVal → ConstExp | '{' [ ConstInitVal { ',' ConstInitVal } ] '}'
    std::unique_ptr<ConstInitValNode> constInitValNode = std::make_unique<ConstInitValNode>();
    if (parser.getLexType(0) != LexType::LBRACE) {
        constInitValNode->ConstExp = ConstExpNode::ConstExpParser(parser);
    } else {
        parser.next();
        if (parser.getLexType(0) != LexType::RBRACE) {
            // [ ConstInitVal { ',' ConstInitVal } ] 存在
            constInitValNode->ConstInitVals.push_back(ConstInitValNode::ConstInitValParser(parser));
            while (parser.getLexType(0) == LexType::COMMA) {
                parser.next();
                constInitValNode->ConstInitVals.push_back(ConstInitValNode::ConstInitValParser(parser));
            }
        }
        if (parser.getLexType(0) == LexType::RBRACE) {
            parser.next();
        }
    }
    return constInitValNode;
}
